Вы - -й посетитель этой странички 

Создание модели соударения шариков с помощью электронной таблицы

О.В. Туркин, Москва

   

    В этой статье речь пойдет о создании компьютерной модели абсолютно упругого удара. Легко понять, что построение модели движения соударяющихся тел с использованием графики в любом языке программирования, даже в среде Visual Basic, достаточно сложная задача.
    Использование электронной таблицы со встроенными средствами программирования, например Microsoft Excel с языком Visual Basic for Applications, позволяет, во-первых, осуществлять часть расчетов средствами самой электронной таблицы с оформлением диаграмм, а во-вторых, легко конструировать интерфейс программы с помощью различных свойств рабочего листа.
    Итак, сначала о самой модели.
    Как известно из школьного курса физики, при абсолютно упругом ударе двух тел массой M 1 и M 2 , движущихся соответственно со скоростями V 1 и V 2 , выполняются законы сохранения импульса
    M1V1 + M2V2 = M1U1 + M2U2
    и закона сохранения энергии
    где U1 и U2 - скорости тел после соударения. Совместное решение двух этих уравнений позволяет определить сначала значение скорости U 1
    M1V12/2 + M2V22/2 = M1U12/2 + M2U22/2
    а затем и U2
    U2 = V1 + U1 - V2
    В нашей модели с помощью вышеприведенных формул будут рассчитываться координаты шариков, движущихся по одной прямой. Для того чтобы соударения происходили многократно, движения шариков ограничены боковыми стенками, при ударе о которые шарики изменяют свою скорость по направлению, сохраняя ее по величине.
    Зададим необходимые для вычисления параметры в ячейках электронной таблицы.
    Воспользуемся возможностью дать ячейкам уникальные имена. Для этого в первой строке, в ячейках А1:D1 соответственно, набираем имена ячеек, чтобы обозначить массы и начальные скорости каждого из шаров, а именно: mmm1, vvv1, mmm2, vvv2. После этого, выделив блок A1:D4, используем пункты меню "Вставка | Имя Создать | строке ниже" и присваиваем ячейкам A2:D2 эти имена. Сразу, чтобы не запутаться в дальнейшем, можно в ячейки А1:D1 ввести пояснения, например, "масса1", "скорость1" и т.д. (см. рисунок на с. 19).
    В ячейки второй строки этого блока нужно ввести числовые значения. Массы шариков целесообразно выбрать в диапазоне от 1 до 10 кг, а скорости - в диапазоне от -10 до +10 м/с.
    Теперь оформим блок E1:F2. В его вторую строку занесем начальные координаты шариков. Будем считать, что расстояние между ограничивающими стенками равно 10 метрам и, кроме того, шар 1 располагается левее шара 2, поэтому значение начальных координат равно соответственно 2 и 6. В ячейку G2 помещаем формулу - разность начальных координат первого и второго шариков. На этом создание области ввода закончено. Ее можно дополнительно оформить с помощью различных методов форматирования, снабдить примечаниями и т.д.
    Переходим к созданию вычислительной области. Пусть эта область - A5:D5. Вписываем формулы - в A5 заносим =mmm1, в C5 - =mmm2. В четвертой строке (ячейки A4 и С4) поместим комментарии - "Первый шар", "Второй шар ". В ячейках B5 и D5 в дальнейшем будут отображаться координаты движущихся шариков. Пока туда можно записать те же значения, что содержатся в E2 и F2. Теперь все готово для построения диаграммы.
    Построим диаграмму, в которой положение шариков будет зависеть от координат (то есть от значений в ячейках B5 и D5), а размеры - от массы (значения в ячейках A5 и C5). Для этого необходимо выбрать пузырьковую диаграмму.
    Выделим диапазон A5:B5 и начнем работу с мастером диаграмм.
    На первом шаге работы мастера выбираем тип диаграммы - пузырьковая.
    На втором шаге, в окне "Ряд", определяем первый ряд (окно "Диапазон данных" пропускаем), для которого указываем значения X: =Лист1!$B$5, значения Y: 2 (вертикальная координата у шариков постоянна и меняться не будет) и размеры - =Лист1!$A$5. Сформировав ряд 1, добавляем ряд 2 с параметрами значения X: =Лист1!$D$5, значение Y: 2, размеры - =Лист1!$C$5.
    На третьем шаге можно поместить заголовок диаграммы, отказаться от легенды и убрать ось Y.
    На четвертом шаге размещаем диаграмму на "имеющемся листе 1".
    Диаграмма с изображением двух шариков готова.
    Используя возможности контекстного меню для диаграмм (области диаграммы, области построения и так далее), оформляем диаграмму по своему вкусу, но для оси Х необходимо установить минимальное и максимальное значения шкалы (соответственно 0 и 10), отказавшись от режима "Авто" для этих параметров. На диаграмму можно поместить объект "Надпись" с соответствующим тестом (как на рисунке).
    Остановимся на этом этапе. До сих пор мы не обращались к языку программирования. В этом не было необходимости. Меняя вручную значения координат шариков или их массы в расчетном блоке (строка 5 таблицы), можно заставить шарики перемещаться по диаграмме. Но для того чтобы заставить шарики двигаться в автоматическом режиме, нужно написать небольшую программу.
    Создадим управляющую (командную) кнопку. Для этого в пункте меню "Вид | Панели инструментов" отметим "Элементы управления". На появившейся панели элементов управления (ЭУ) нажимаем иконку "режима конструктора", находим иконку "Кнопка" и размещаем этот элемент управления на нашем рабочем листе.
    Далее, с помощью иконки "Свойства" на панели ЭУ открываем окно свойств этой самой "Кнопки" и изменим внешний вид кнопки. Например, свойство Caption означает надпись на элементе. Заменим стандартную надпись "CommanButton1" на слово "Старт", также можно изменить стиль и цвет фона (BackStyle и BackColor), тип, размеры и цвет шрифта (Font и ForeColor). При этом сам элемент "Кнопка" должен быть выделен как объект. Вообще в области среды программирования VBA, в которой мы оказались, действуют свои правила, и надо быть достаточно осторожным.
    Скажем, свойство Name лучше не менять.
   
    Итак, кнопка имеет надпись "Старт", окрашена выбранным цветом, теперь нужно заставить ее заработать: шарики должны двигаться по диаграмме и при столкновении менять свои скорости в соответствии с нашими формулами.
    Начинаем составлять программу. Дважды щелкнем по нашей красивой кнопке и начнем работу в окне исходного текста Visual Basic. В этот редактор также можно попасть через панель ЭУ (иконка "Исходный текст"), через ярлычок рабочего листа (та же иконка в контекстном меню) или через "Меню | Сервис | Макрос | Редактор:".
    В окне уже есть две строки:
    Private Sub CommandButton1_Click()
    End Sub
    В переводе - "локальная процедура (подпрограмма) для обработки щелчка по CommandButton1" и "конец процедуры". Между этими строчками и будет размещаться наш код. В первую очередь позаботимся о том, чтобы данные из ячеек ЭТ попали в переменные программы. Нам нужны начальные координаты шариков. Это ячейки E2 и F2 (строка 2, столбцы 5 и 6), поэтому две первые строчки будут выглядеть так:
    xxn1 = Cells(2, 5)
    xxn2 = Cells(2, 6)
    В этих двух строчках происходит передача данных из ячеек (объекты из коллекции Cells) листа в переменные программы. Конкретные ячейки определяются через номер строки и номер столбца.
    Теперь определимся со скоростями. Начальные скорости расположены в ячейках B2 и D2. В программе мы их обозначим через переменные dx1 и dx2. Координату шарика через промежуток времени t мы будем вычислять в соответствии с известной формулой физики
    X = X 0 +Vot.
    Полагаем t = 1/10, и тогда dx = V/10. Получаем следующие две строчки:
    dx1 = Cells(2, 2) / 10
    dx2 = Cells(2, 4) / 10
    Очередные две строчки - это передача начальных координат в текущие координаты - переменные x1 и x2, которые будут использованы в цикле
    x1 = xxn1
    x2 = xxn2
    Кроме того, в программе понадобятся и массы. Они располагаются в ячейках A2 и C2, поэтому
    m1 = Cells(2, 1)
    m2 = Cells(2, 3)
    Теперь организуем цикл со стократным повторением, считая, что одно выполнение цикла соответствует 1/10 с, то есть процесс происходит в течение 10 условных секунд. При выбранных скоростях и расстояниях такое значение можно считать оптимальным.
    For i = 1 To 100
    Позаботимся, чтобы шарики не вылетали за стенки.
    Первый шарик не должен улететь налево, и если он приблизился к левой стенке (ее координата равна 0), то величина его скорости должна поменять знак. Кроме того, чтобы зрительно шарик не пересекал стенку, запретим ему приближаться к ней ближе чем на 0,5.
    Поэтому
    If x1 <= 0.5 Then dx1 = Abs(dx1)
    Для второго шарика опасна правая стенка с координатой 10, и с учетом его размеров получаем:
    If x2 >= 9.5 Then dx2 = -1 * Abs(dx2)
    Следующий шаг - это процесс соударения. Когда первый шарик (левый) приблизился ко второму менее чем на 1 (размеры шариков), то скорости шариков меняются в соответствии с формулами (1) и (2).
    Попутно заметим, что если мы работаем в системе СИ, то шарики у нас - метровые гиганты. Вот такой супербоулинг!
    If x1 >= x2 - 1# Then
    a = dx1 'это скорость V1 перед ударом,
    dx1 = (dx1 * (m1 - m2) + 2 * dx2 * m2) / _
    (m1 + m2) 'скорость U1
    dx2 = a + dx1 - dx2 'скорость U2
    End If
    Итак, значения скорости тел в случае соударений со стенками или друг с другом определены, теперь находим новые координаты через очередные 1/10 с.
    x1 = x1 + dx1
    x2 = x2 + dx2
    Отправим эти значения в ЭТ, чтобы изменить диаграмму. Вспомним, что положение шариков в диаграмме определяется ячейками B5 и D5:
    Cells(5, 2) = x1
    Cells(5, 4) = x2
    Следующая строка кода очень важна. Она дает команду электронной таблице произвести перерасчет в соответствии с новыми данными, а также перестроить диаграмму (перевод команды - "делай события").
    DoEvents
    Завершаем цикл:
    Next i
    Полностью код выглядит следующим образом.
    Private Sub CommandButton1_Click()
    xxn1 = Cells(2, 5)
    xxn2 = Cells(2, 6)
    dx1 = Cells(2, 2) / 10
    dx2 = Cells(2, 4) / 10
    x1 = xxn1
    x2 = xxn2
    m1 = Cells(2, 1)
    m2 = Cells(2, 3)
    For i = 1 To 100
    If x1 <= 0.5 Then dx1 = Abs(dx1)
    If x2 >= 9.5 Then dx2 = -1 * Abs(dx2)
    If x1 >= x2 - 1# Then
    a = dx1
    dx1 = (dx1 * (m1 - m2) + 2 * dx2 * m2) / _
    (m1 + m2)
    dx2 = a + dx1 - dx2
    End If
    x1 = x1 + dx1
    x2 = x2 + dx2
    Cells(5, 2) = x1
    Cells(5, 4) = x2
    DoEvents
    Next i
    End Sub
    Теперь вернемся в электронную таблицу, например, через значок таблицы в левом верхнем углу окна. Иконка "Режим конструктора" должна быть отжата, а ячейки во второй строке (начальные значения) должны быть заполнены. Не забудьте убрать выделение с диаграммы.
    Щелкаем по кнопке "Старт" и любуемся.
    Если программа не работает, то в Office2000 это может быть связано с режимом безопасности. Заходим в "Меню | Сервис | Макрос | Безопасность" и выбираем средний уровень безопасности. Сохраняем рабочую книгу, выходим из приложения и запускаем эту рабочую книгу опять, но теперь при загрузке на вопрос о включении макросов отвечаем, что макросы должны быть включены.
    Проверить программу можно следующим образом: при равенстве масс тел и одинаковых по абсолютному значению, но противоположно направленных скоростях должна получиться симметричная картинка. Задаем начальные значения - массы по 5, скорости 5 и -5, начальные значения - 2,5 и 7,5. Получаем достаточно знакомую картину соударения двух одинаковых шаров с одинаковыми скоростями. Именно такой вариант изображен на рисунке.
    Кроме того, во время работы программы можно заметить, что в ячейках пятой строки меняются значения. Это изменяются координаты шариков. При желании можно вывести в какие-нибудь ячейки и значения скоростей. Таким образом, ячейки таблицы играют роль ячеек памяти и позволяют наблюдать за изменением значений переменных, что полезно для анализа работы программ или ее отладки.
    Как видим, для создания движущейся модели понадобилось не так уж и много времени, и за 2 часа с классом средней подготовки ее вполне можно реализовать. И еще раз хочется обратить внимание на то, что программный код был использован только тогда, когда появилась необходимость в динамических расчетах. Такое продуманное использование VBA действительно открывает широкие возможности для творчества.
    В следующий раз мы рассмотрим проект, в котором строятся одновременно 3 графика изопроцесссов для идеальных газов с возможностью иллюстрации замкнутых газовых циклов. Эти процессы иллюстрируются диаграммой изменения количества теплоты, внутренней энергии и работы.